package com.liliudong.template.biz.service.sys;

import com.liliudong.template.common.constant.DataScopeConst;
import com.liliudong.template.common.request.sys.SysRoleAddRequest;
import com.liliudong.template.common.request.sys.SysRoleModifyRequest;
import com.liliudong.template.common.entity.sys.SysRole;
import com.liliudong.template.common.response.sys.SysRoleDetailResponse;
import com.liliudong.template.common.response.sys.SysRolePageResponse;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.service.IService;

import java.util.List;
import java.util.Set;

import static com.liliudong.template.common.entity.sys.table.SysRoleTableDef.SYS_ROLE;

public interface SysRoleService extends IService<SysRole> {

    default QueryChain<SysRole> queryChainIgnoreDataPermission() {
        return queryChain()
                .from(SYS_ROLE.as(DataScopeConst.IGNORE_TABLE_ALIAS));
    }

    /**
     * 按用户id列出忽略数据权限
     *
     * @param userId 用户id
     * @return {@link List }<{@link SysRole }>
     */
    List<SysRole> listByUserIdIgnoreDataPermission(Long userId);

    /**
     * 按用户id列出数据范围忽略数据权限
     *
     * @param userId  用户id
     * @param isAdmin
     * @return {@link Set }<{@link SysRole.DataScope }>
     */
    Set<SysRole.DataScope> listDataScopeByUserIdIgnoreDataPermission(Long userId, boolean isAdmin);

    /**
     * 添加一个
     *
     * @param sysRoleAddRequest 系统角色添加到
     */
    void addOne(SysRoleAddRequest sysRoleAddRequest);

    /**
     * 按id删除
     *
     * @param id 身份证件
     */
    void deleteById(Long id);

    /**
     * 按id修改
     *
     * @param id               身份证件
     * @param sysRoleModifyRequest 系统角色修改数据
     */
    void modifyById(Long id, SysRoleModifyRequest sysRoleModifyRequest);

    /**
     * 查询页面
     *
     * @param page 页面
     * @param size 大小
     * @return {@link Page }<{@link SysRolePageResponse }>
     */
    Page<SysRolePageResponse> queryPage(Long page, Long size);

    /**
     * 按id详细信息
     *
     * @param id 身份证件
     * @return {@link SysRoleDetailResponse }
     */
    SysRoleDetailResponse detailById(Long id);
}
